import java.util.ArrayList;
import java.util.List;

public class 位运算 {
    public static void main(String[] args) {
        int a = 5; // 二进制: 0101
        int b = 3; // 二进制: 0011

        // 按位与 (&)
        // 0101 (a)
        // 0011 (b)
        // ----
        // 0001 (结果)
        System.out.println("a & b = " + (a & b));
        // 输出: 1 (0001)

        // 按位或 (|)
        // 0101 (a)
        // 0011 (b)
        // ----
        // 0111 (结果)
        System.out.println("a | b = " + (a | b));
        // 输出: 7 (0111)

        // 按位异或 (^)
        // 0101 (a)
        // 0011 (b)
        // ----
        // 0110 (结果)
        System.out.println("a ^ b = " + (a ^ b));
        // 输出: 6 (0110)

        // 左移 (<<)
        // 0101 (a) 左移1位
        // ----
        // 1010 (结果)
        System.out.println("a << 1 = " + (a << 1));
        // 输出: 10 (1010)

        // 右移 (>>)
        // 0101 (a) 右移1位
        // ----
        // 0010 (结果)
        System.out.println("a >> 1 = " + (a >> 1));
        // 输出: 2 (0010)

        // 获取 n 以内二的幂次数列
        List<Integer> list1 = 二的幂次数列(100);
        for (int num : list1) {
            System.out.println("二的幂次数列：" + num);
        }

        List<Integer> list2 = 二进制下每一位全为一的数列(100);
        for (int num : list2) {
            System.out.println("二进制下每一位全为一的数列：" + num);
        }
    }

    static List<Integer> 二的幂次数列(int n) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if ((i & (i - 1)) == 0) {
                list.add(i);
            }
        }
        return list;
    }

    static List<Integer> 二进制下每一位全为一的数列(int n) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= n; i++) {
            if ((i & (i - 1)) == 0) {
                if (i - 1 != 0) list.add(i - 1);
            }
        }
        return list;
    }
}
